/*
 * @Author: jiangyg email@jiangyg.com
 * @Date: 2022-10-31 19:54:34
 * @LastEditors: jiangyg email@jiangyg.com
 * @LastEditTime: 2022-11-15 00:03:11
 * @FilePath: /frontend/mall-frontend/src/utils/httpRequest.js
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
import qs from "qs";
import axios from "axios";
import merge from "lodash/merge";
import router from "@/router";
import admin from "@/utils/admin";
import { ElMessage } from "element-plus";

const _instance = axios.create({
  timeout: 1000 * 30,
  withCredentials: true,
  headers: {
    "Content-Type": "application/json; charset=utf-8",
  },
});

/**
 * 请求拦截
 */
_instance.interceptors.request.use(
  (config) => {
    // 1. 请求头追加cid参数
    let cid = window.cid;
    config.headers["cid"] = cid;
    // 2. 后台管理请求处理
    if (cid === "a") {
      let token = localStorage.getItem("admin.token") || "";
      if (token) {
        config.headers["token"] = token;
      }
      return config;
    }
    // 3. 商城请求处理（基于session登录，所以不需要任何处理）
    if (cid === "m") {
      return config;
    }
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

/**
 * 响应拦截
 */
_instance.interceptors.response.use(
  (response) => {
    let cid = window.cid;
    // 1. 后台管理响应处理
    if (cid === "a") {
      // 更新token
      if (response.headers && response.headers.token) {
        localStorage.setItem("admin.token", response.headers.token);
      }
      // token失效，跳转到登录页面
      let code = response.data && response.data.code;
      if (code === "422") {
        admin.clearLoginInfo();
        router.push({ name: "admin-login" });
      }
    }
    return response;
  },
  (error) => {
    return Promise.reject(error);
  }
);

const http = {
  // axios 实例
  instance: _instance,

  /**
   * 请求地址处理
   * @param {*} actionName action方法名称
   */
  adornUrl(actionName) {
    return (
      import.meta.env.VITE_APP_BASE_URL +
      actionName +
      (actionName.indexOf("?") !== -1 ? "&" : "?") +
      "r=" +
      Math.random()
    );
  },

  /**
   * post请求数据处理
   * @param {*} data 数据对象
   * @param {*} openDefultdata 是否开启默认数据?
   * @param {*} contentType 数据格式
   *  json: 'application/json; charset=utf-8'
   *  form: 'application/x-www-form-urlencoded; charset=utf-8'
   */
  adornData(data = {}, openDefultdata = true, contentType = "json") {
    var defaults = {
      t: new Date().getTime(),
    };
    data = openDefultdata ? merge(defaults, data) : data;
    return contentType === "json" ? JSON.stringify(data) : qs.stringify(data);
  },

  /**
   * get请求参数处理
   * @param {*} params 参数对象
   * @param {*} openDefultParams 是否开启默认参数?
   */
  adornParams(params = {}, openDefultParams = true) {
    let defaults = {
      't': new Date().getTime()
    };
    return openDefultParams ? merge(defaults, params) : params;
  },

  /**
   * 简单的get请求
   * @param {*} options  请求参数
   */
  get(options) {
    // 1. 创建新的提交数据对象
    let newo = merge({ method: "get" }, options);
    // 2. 处理提交请求参数
    newo.url = this.adornUrl(newo.url);
    // 3. 执行请求
    return this.instance(newo);
  },

  /**
   * 简单的post请求
   * @param {*} options  请求参数
   */
  post(options) {
    // 1. 创建新的提交数据对象
    let newo = merge({ method: "post" }, options);
    // 2. 处理提交请求参数
    newo.url = this.adornUrl(newo.url);
    if (newo.data) {
      newo.data = this.adornData(newo.data);
    }
    if (newo.params) {
      newo.params = this.adornParams(newo.params);
    }
    // 3. 执行请求
    return this.instance(newo);
  },

  /**
   * 判断请求是否成功
   * @param data 请求返回数据
   * @param errorTip 是否提示错误信息，默认提示
   * @param sussceeTip 是否提示成功信息，默认提示
   * @returns {boolean} 请求是否成功
   */
  success(data = {}, errorTip = true, sussceeTip = false) {
    let code = data && data.code;
    // 请求没有权限
    if (code === "200") {
      if (sussceeTip) {
        ElMessage.success("操作成功");
      }
      return true;
    }
    // 字段校验提示
    if (code === "412") {
      let validation =
        (data.validation && data.validation.length > 0 && data.validation[0]) ||
        undefined;
      if (validation) {
        ElMessage.error(validation.message);
        return false;
      }
    }
    // 是否错误默认提示
    if (errorTip) {
      ElMessage.error(data.msg);
    }
    return false;
  },
};

export default http;
